#include "main.h"
#include "pidControl.h"
#include "SailBorad_entry.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "CaiDan.h"
#include "OLED.h"
#include "tim.h"
#include "usart.h"

/*Init private begin*/
uint8_t flag=0;
uint8_t msg[64];

uint8_t Sail_angle_buf[100];
int Sail_angle=0;
int Sail_angle_Target;

uint8_t waiting=0;
uint8_t time_Slice=0;
uint8_t time_Slice_Flag=0;

float Final_Calc=0;
uint16_t Fan_pwm = 0;
int DuoJi_Angle=0;
uint8_t Fan_Control_Flag=0;
uint8_t Serial_RxFlag;
uint8_t RxData;
/*Init private end*/

void setup(){
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
    HAL_TIM_Base_Start_IT(&htim1);
    HAL_TIM_Base_Start_IT(&htim4);
    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
    HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);
    OLED_Init();
    PID_Init();
    //__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
    HAL_UART_Receive_IT(&huart1,&RxData, 1);
    PlaySimpleMusic();
}

void loop(){
    //按键延时
    if(clear_flag) {
        HAL_Delay(20);
        OLED_Clear();
        clear_flag=0;
    }
    table[func_index].current_operation();
    //接收成功，角度转换，标志位0，开始下一次接收。
    if(Serial_RxFlag == 1) {
        Sail_angle = atoi(Sail_angle_buf);
        Serial_RxFlag = 0;
    }
}


/*第一题题目index=7，第二题4，第三题4，第四题8，第五题6+8*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM1) {
        //风扇pwm和角度的拟合转动
        if(Fan_Control_Flag==1) {
            Fan_pwm = NiHe_Model_Final(abs(Sail_angle_Target),-DuoJi_Angle);
            Fan_Control(Fan_pwm+Final_Calc);
        }
        //主页键，时间片归零
        if(func_index==0) {
            time_Slice_Flag = 0;
            time_Slice=0;

        }
        else if(func_index==4) {//进入Show Angle，停止风扇开始手动转动。
            Fan_Control_Flag = 0;
            Fan_pwm = 0;
            Fan_Control(0);
            Sail_angle_Target=0;
            button=0;
        }
        else if(func_index==5) {//第四题
            Fan_Control_Flag = 0;
            Read_Encoder(&Sail_angle_Target);
            Limit(&Sail_angle_Target,70);
        }else if(func_index==6) {//第五题
            Read_Encoder(&DuoJi_Angle);
            Position_Control(&DuoJi_Angle);
        }else if(func_index==7) {//第一题，第三题
            Read_Encoder(&button);
            Limit(&button,300);
            Fan_pwm=abs(button)*50/3.0;
            Fan_Control(Fan_pwm);
        }else if(func_index==8) {//第四题，角度设置确定后开始给风力
            Fan_Control_Flag=1;
            if(Sail_angle-abs(Sail_angle_Target)<=10&&Sail_angle-abs(Sail_angle_Target)>=-10&&time_Slice_Flag==0) {
                time_Slice_Flag=1;
            }
            /*声光提醒一秒*/
            if(time_Slice_Flag==1) {
                time_Slice++;
                LightBeef(1);
                if(time_Slice>=200) {
                    LightBeef(0);
                    time_Slice=0;
                    time_Slice_Flag=2;
                }
            }

        }
    }
/*if (htim->Instance == TIM4) {
        uint8_t i = 0;
        sprintf(msg, "%d,%d,%d\r\n",DuoJi_Angle, Sail_angle, Fan_pwm);
        HAL_UART_Transmit(&huart1, msg, strlen(msg), 10);
        if(Fan_pwm < 2000) Fan_pwm += 12;
        else Fan_pwm += 6;
        if(Fan_pwm >= 4999) {
            sprintf(msg, "MAXpwm power not enough\r\n");
            HAL_UART_Transmit(&huart1, msg, sizeof(msg), 10);
            HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
            Fan_pwm = 0;
        }
        if(Sail_angle > 70) {
            Fan_pwm = 0;
            Sail_angle = 0;
            HAL_TIM_Base_Stop_IT(&htim4);

            if(DuoJi_Angle>84) {
                DuoJi_Angle=84;
                sprintf(msg, "The collection of sample is completed\r\n");
                HAL_UART_Transmit(&huart1, msg, sizeof(msg), 10);
                HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

            }
            if(DuoJi_Angle<=-84) DuoJi_Angle=-84;
        }
        Fan_Control(Fan_pwm);
        Position_Control(&DuoJi_Angle);
    }*/
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if(clear_flag==1)
        return;
    if (GPIO_Pin == Key1_Pin) {
            func_index=table[func_index].next;
            clear_flag=1;

    }
    if (GPIO_Pin == Key2_Pin) {
        func_index=table[func_index].enter;
        clear_flag=1;
    }

}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    // 确保是 USART1 的回调
    static uint8_t RxState = 0;        //定义表示当前状态机状态的静态变量
    static uint8_t pRxPacket = 0;    //定义表示当前接收数据位置的静态变量
    //HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    if (huart == &huart1) {
        // 状态机处理接收到的数据

        if (RxState == 0) // 当前状态为 0，接收数据包包头
        {
            if (RxData == '@' && Serial_RxFlag == 0) // 判断是否为数据包包头
            {
                RxState = 1;         // 切换到状态 1
                pRxPacket = 0;       // 重置接收数据位置
            }
        }
        else if (RxState == 1) // 当前状态为 1，接收数据包数据，同时判断第一个包尾
        {
            if (RxData == '\r')  // 判断是否为第一个包尾
            {
                RxState = 2;       // 切换到状态 2
            }
            else  // 接收到正常数据
            {
                Sail_angle_buf[pRxPacket] = RxData; // 将数据存储到接收数据包数组
                pRxPacket++;       // 增加数据包的位置
            }
        }
        else if (RxState == 2) // 当前状态为 2，接收数据包第二个包尾
        {
            if (RxData == '\n') // 判断是否为第二个包尾
            {
                RxState = 0;       // 重置状态机
                Sail_angle_buf[pRxPacket] = '\0';   // 添加字符串结束符
                Serial_RxFlag = 1 ; // 标记数据包接收成功
            }
        }
        HAL_UART_Receive_IT(&huart1, &RxData, 1);
    }
}
void auto_collect_sample(void) {
    /*DuoJi_Angle = -84;
    Fan_pwm = 0;
    Position_Control(&DuoJi_Angle);*/
}